#!/usr/bin/env node

const http = require('http'),
      qs = require('querystring'),
      fs = require('fs'),
      log = console.log;

let items=['eat', 'sleep'],
    result = {
      status: 200,
      reason: 'ok',
      //count: 0,
      //data: [],
    };

http.createServer((req, res) => {
  
  logRequest(req);
  if(req.url.slice(0,5) !== '/todo') {
    let html = fs.readFileSync('./12-todo.html').toString('utf8');
    if(req.url === '/'){
      res.end(html);
    }else if(req.url == '/12-todo.js'){
      fs.createReadStream('./12-todo.js').pipe(res);
    }else{
      res.end('not api resquest and not page request!');
    }

    return;
  }
  switch(req.method){
    case 'GET':
      select(req, res);
      break;

    case 'POST':
      insert(req, res);
      break;

    case 'PUT':
      updata(req, res);
      break;

    case 'DELETE':
      remove(req, res);
      break;

    default:
      res.end(`${req.method} method not support`);
      break;
  }

}).listen(8080);

function select(req, res){
  result.data = items;
  res.end(JSON.stringify(result));
 
}
function insert(req, res){
  let data = '';

  req.on('data', chunk => data+= chunk);
  req.on('end', () => {
    let item = qs.parse(data).item;
    if(item !== '' && typeof item !== 'undefined'){
      items.push(item);
      res.end(JSON.stringify(result));
    }else{
      result.status = 401;
      res.reason = 'item is empty';
      res.end(JSON.stringify(result));
    }
  });
}
function updata(req, res){
  //get id
  let id = req.url.split(':')[1];
  //validate id
  //data type
  //value min=0, max=items.length
  
  //get item
  let data = '';
  req.on('data', chunk => data += chunk);
  req.on('end', ()=>{
    //updata items[id]=item
    let item = qs.parse(data).item;
    if(item !== '' && typeof item !== 'undefined'){
      items[id] = item;
      res.end(JSON.stringify(result));
    }else{
      result.status = 401;
      result.reason = 'item is empty';
      res.end(JSON.stringify(result));
    }
  });
  res.end(req.method);

}
function remove(req, res){  
  // get id 
  let id = req.url.split(':')[1];
  //id not exits del all
  if(typeof id === 'undefined'){
    items = [];
    result.status = 200;
    result.reason = 'delete all success';
    res.end(JSON.stringify(result));
    return;
  }
  //id exist
  //valide id
  //id is ok del items[id]
  log('id='+id);

  //splice返回被删除的项目
  items.splice(id, 1);
  result.status = 200;
  result.reason = 'del success';
  res.end(JSON.stringify(result));
}
function logRequest(req){
  log(`${req.method} ${req.url} HTTP/${req.httpVersion}`);
  log(req.headers);
  log();
}


